package com.zq.gateway.config;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.strategy.SaStrategy;
import com.zq.common.util.JwtUtil;
import com.zq.common.util.Result;
import com.zq.gateway.Properties.ExcludeSysPath;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

///**
// * [Sa-Token 权限认证] 配置类
// * @author click33
// */
@Configuration
@Slf4j
public class SaTokenConfigure {

    /**
     * 重写 Sa-Token 框架内部算法策略
     */
    @Autowired
    private JwtUtil jwtUtil;


    @Autowired
    public void rewriteSaStrategy() {
        // 重写 Token 生成策略
        SaStrategy.instance.createToken = (loginId, loginType) -> {
//            return SaFoxUtil.getRandomString(60);    // 随机60位长度字符串
            return jwtUtil.generateToken((Integer) loginId);    // 使用 JWT 方式生成 Token
        };
    }


//    排除sys系统中不需要拦截的路径
    @Autowired
    private ExcludeSysPath excludeSysPath;

    // 注册 Sa-Token全局过滤器
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                .addInclude("/**") // 拦截所有请求
            // 鉴权方法：每次访问进入
            .setAuth(obj -> {
                // 登录校验 -- 拦截所有后台管理端的所有路由，并放开一些特定的接口
                SaRouter.
                        match("/sys/**").
                        notMatch(excludeSysPath.getSyspaths()).
                        check(r->StpUtil.checkLogin());






            })
            // 异常处理方法：每次setAuth函数出现异常时进入
            .setError(e -> {
                log.error("出现登录异常=======>"+e.getMessage());
                return Result.errorData(e.getMessage());
            })
                //当你使用 header 头提交 token 时，会产生跨域问题。解决方法== 前置函数：在每次认证函数之前执行
                .setBeforeAuth(obj -> {
                    SaHolder.getResponse()

                            // ---------- 设置跨域响应头 ----------
                            // 允许指定域访问跨域资源
                            .setHeader("Access-Control-Allow-Origin", "*")
                            // 允许所有请求方式
                            .setHeader("Access-Control-Allow-Methods", "*")
                            // 允许的header参数
                            .setHeader("Access-Control-Allow-Headers", "*")
                            // 有效时间
                            .setHeader("Access-Control-Max-Age", "3600")
                    ;
                    // 如果是预检请求，则立即返回到前端
                    SaRouter.match(SaHttpMethod.OPTIONS)
                            .free(r -> System.out.println("--------OPTIONS预检请求，不做处理"))
                            .back();
                })
                ;
    }

}
